package com.zzy.algorithm.linkedList;

import com.zzy.algorithm.model.ListNode;

/**
 * 剑指Offer - 22 : 链表中倒数第k个节点
 *
 * 输入一个链表，输出该链表中倒数第k个节点。为了符合大多数人的习惯，本题从1开始计数，即链表的尾节点是倒数第1个节点。
 *
 * 例如，一个链表有 6 个节点，从头节点开始，它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
 *
 * 解题思路：
 * 方法一：
 */
public class Q15_TheLastKNodeInLinkedList {

    public static void main(String[] args) {
        Q15_TheLastKNodeInLinkedList q15_theLastKNodeInLinkedList = new Q15_TheLastKNodeInLinkedList();
        ListNode solution = q15_theLastKNodeInLinkedList.solution2(ListNode.list5,2);
        while(solution != null){
            System.out.println(solution.val);
            solution = solution.next;
        }
    }

    private ListNode solution(ListNode head,int k){
        int i = 0;
        ListNode node = head;
        while (node != null){
            node = node.next;
            i++;
        }
        for(int j = 0 ; j < i - k; j++){
            head = head.next;
        }
        return head;
    }

    private ListNode solution2(ListNode head,int k){
        ListNode fast = head;
        for(int i = 0 ; i < k ; i++){
            fast = fast.next;
        }
        while(fast != null){
            fast = fast.next;
            head = head.next;
        }
        return head;
    }

}
